home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / sync / sun3.md / Sync_GetLock.s < prev    next >
Text File  |  1990-02-12  |  2KB  |  78 lines

  1. |*
  2. |* syncAsm.s --
  3. |*
  4. |*    Source code for the Sync_GetLock library procedure.
  5. |*
  6. |* Copyright 1988 Regents of the University of California
  7. |* Permission to use, copy, modify, and distribute this
  8. |* software and its documentation for any purpose and without
  9. |* fee is hereby granted, provided that the above copyright
  10. |* notice appear in all copies.  The University of California
  11. |* makes no representations about the suitability of this
  12. |* software for any purpose.  It is provided "as is" without
  13. |* express or implied warranty.
  14. |*
  15.  
  16.     .data
  17.     .asciz "$Header: /sprite/src/lib/c/sync/sun3.md/RCS/Sync_GetLock.s,v 1.2 90/02/12 02:52:36 rab Exp $ SPRITE (Berkeley)"
  18.     .even
  19.     .text
  20.  
  21.  
  22. /*
  23.  * ----------------------------------------------------------------------------
  24.  *
  25.  * Sync_GetLock --
  26.  *
  27.  *    Acquire a lock.  Other processes trying to acquire the lock
  28.  *    will block until this lock is released.
  29.  *
  30.  *      A critical section of code is protected by a lock.  To safely
  31.  *      execute the code, the caller must first call Sync_GetLock to
  32.  *      acquire the lock on the critical section.  At the end of the
  33.  *      critical section the caller has to call Sync_Unlock to release
  34.  *      the lock and allow other processes to execute in the critical
  35.  *      section.
  36.  *
  37.  * Results:
  38.  *    None.
  39.  *
  40.  * Side effects:
  41.  *      The lock is set.  Other processes will be blocked if they try
  42.  *      to lock the same lock.  A blocked process will try to get the
  43.  *      lock after this process unlocks the lock with Sync_Unlock.
  44.  *
  45.  * C equivalent:
  46.  *
  47.  *    void
  48.  *    Sync_GetLock(lockPtr)
  49.  *       Sync_Lock *lockPtr;
  50.  *    {
  51.  *        if (Sun_TestAndSet(&(lockPtr->inUse)) != 0) {
  52.  *        Sync_SlowLock(lockPtr); 
  53.  *        }
  54.  *    }
  55.  *
  56.  *----------------------------------------------------------------------
  57.  */
  58.  
  59.     .text
  60.     .globl _Sync_GetLock
  61. _Sync_GetLock:
  62.  
  63.     movl    sp@(4), a0    | Move address of lockPtr->inUse to a0.
  64.  
  65.     /*
  66.      * This TestAndSet races with the assignment statement in Sync_Unlock
  67.      * that clears the inUse bit.  The worst case is that we incorrectly
  68.      * assume the lock is taken just as someone clears this bit.  This is
  69.      * ok because we'll call Sync_SlowLock which does the check again
  70.      * inside a protected critical section.
  71.      */
  72.  
  73.     tas        a0@        | Test and set the inUse flag.
  74.     beq        1f        | If it wasn't set then just return.
  75.  
  76.     jra        _Sync_SlowLock | If it was set then we must do a slow lock.
  77. 1:  rts
  78.